# !/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time        : 2021/3/28 14:38
@Author      : Albert Darren
@Contact     : 2563491540@qq.com
@File        : full_permutation.py
@Version     : Version 1.0.0
@Description : TODO
@Created By  : PyCharm
"""
import json
import copy


def loop_permutation(n):
    if n == 1:
        return 1
    res = [[0]]  # 最终结果
    for i in range(2, n + 1):
        for j in range(len(res)):  # 遍历res数组（二维数组）
            for x in range(len(res[j]) + 1):  # 遍历res数组中的元素（一维数组）
                data = copy.copy(res[j])  # 浅拷贝，中间结果
                data.insert(x, i - 1)  # 在一维数组的不同位置插入元素，获得新的数组
                res.append(data)
                x += 1
            j += 1
        # 删除多余数组（原始数组） 最后保留的数据(一维数组的长度) == i
        while True:
            if len(res[0]) != i:
                res.remove(res[0])
            else:
                break
        i += 1
    return res


def permutation(seq, num=2, flag=","):
    """
    返回任意序列类型数据进行全排列结果
    :param seq: 任意序列
    :param num: 排列数默认为2，即全排列，范围为[2,max_len+1]
    :param flag: 合并标记
    :return: 全排列结果
    """
    seq_len = len(seq)
    if seq_len < num:  # 直接返回str
        return seq
    else:
        result = []
        for i in range(seq_len):
            ch = seq[i]
            rest = seq[0:i] + seq[i + 1:seq_len]
            for s in permutation(rest, num):
                result.append(ch + flag + s)  # 标记合并
    return result


def permutation_parser(parse_ls, flag=","):
    """
    解析json序列化的标记合并全排列结果
    :param parse_ls: 标记合并全排列结果
    :param flag:合并标记
    :return: 全排列结果
    """
    per_ls = []
    for item in parse_ls:
        per_ls.append([json.loads(i) for i in item.split(flag)])
    return per_ls


if __name__ == '__main__':
    # 第一组测试用例，递归实现
    ls = [0, 1, 2, 3, 4]
    str_ls = [json.dumps(i) for i in ls]
    print(permutation_parser(permutation(str_ls)))
    # 第二组测试，循环实现
    # print(loop_permutation(5))
    # # 第二组测试用例
    # ls = "abc"
    # str_ls = [json.dumps(i) for i in ls]
    # print(permutation_parser(permutation(str_ls)))
    # # 第三组测试用例
    # ls = ("a", 1.0, [])
    # str_ls = [json.dumps(i) for i in ls]
    # print(permutation_parser(permutation(str_ls, 3)))  # 指定为2排列
